package com.icoolkj.learn.juc.base.twophasetermination;

import com.icoolkj.learn.juc.base.utils.SleepTools;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author icoolkj
 * @version 1.0
 * @description 如何优雅的终止线程池
 * @createDate 2025/03/05 13:24
 */
@Slf4j
public class ThreadPoolDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 10; i++) {
            int finalI = i;
            executorService.submit(()->{
                // 执行任务操作
                log.info("{} 正在执行任务 {}...", Thread.currentThread().getName(), finalI);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // 重新设置中断状态
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                } finally {
                    log.info("{} 任务 {} 执行完成", Thread.currentThread().getName(), finalI);
                }
            }, "thread-" + i);
        }

        // 停止线程池接收新任务，但不能强制停止已经提交的任务
        executorService.shutdown();

        // 的带线程池中的人物执行完毕，或者超时时间到达
        try {
            boolean termination = executorService.awaitTermination(3, TimeUnit.SECONDS);
            if (!termination) {
                // 如果线程池还有未执行完毕的任务，则调用线程池的 shutdownNow 方法，中断所有正在执行的任务
                // 如果有还没开始的任务，则返回未执行的任务列表
                List<Runnable> tasks = executorService.shutdownNow();
                log.info("剩余未执行的任务数：{}", tasks.size());
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }


    }

}
